package cn.edu.scnu.semart.goods.service;

import cn.edu.scnu.semart.model.goods.Goods;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 商品Service接口
 */
public interface GoodsService extends IService<Goods> {

    /**
     * 搜索商品
     * @param page 分页参数
     * @param keyword 搜索关键词
     * @param categoryId 分类ID
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param sortBy 排序字段
     * @param sortOrder 排序方向
     * @return 分页结果
     */
    IPage<Goods> searchGoods(Page<Goods> page, String keyword, Integer categoryId, 
                             Double minPrice, Double maxPrice, String sortBy, String sortOrder);

    /**
     * 管理员搜索商品（返回所有审核状态的商品）
     */
    IPage<Goods> searchAllAuditStatusGoods(Page<Goods> page, String keyword, Integer categoryId,
                                           Double minPrice, Double maxPrice, String sortBy,
                                           String sortOrder, Integer auditStatus);

    /**
     * 获取商品详情
     * @param id 商品ID
     * @return 商品详情
     */
    Goods getGoodsDetail(Integer id);

    /**
     * 根据用户ID获取商品列表
     * @param userId 用户ID
     * @param page 分页参数
     * @return 商品分页列表
     */
    IPage<Goods> getGoodsByUserId(Integer userId, Page<Goods> page);

    /**
     * 根据分类获取商品列表
     * @param categoryId 分类ID
     * @param page 分页参数
     * @return 商品列表
     */
    IPage<Goods> getGoodsByCategory(Integer categoryId, Page<Goods> page);

    /**
     * 获取热门商品
     * @param limit 限制数量
     * @return 热门商品列表
     */
    List<Goods> getHotGoods(Integer limit);

    /**
     * 获取推荐商品
     * @param limit 限制数量
     * @return 推荐商品列表
     */
    List<Goods> getRecommendGoods(Integer limit);

    /**
     * 更新商品销量
     * @param goodsId 商品ID
     * @param quantity 销售数量
     * @return 是否成功
     */
    boolean updateSales(Integer goodsId, Integer quantity);

    /**
     * 更新商品库存
     * @param goodsId 商品ID
     * @param quantity 库存变化量
     * @return 是否成功
     */
    boolean updateStock(Integer goodsId, Integer quantity);

    /**
     * 获取待审核商品列表
     * @param page 分页参数
     * @return 待审核商品列表
     */
    IPage<Goods> getPendingAuditGoods(Page<Goods> page);

    /**
     * 获取已审核商品列表
     * @param page 分页参数
     * @return 已审核商品列表
     */
    IPage<Goods> getAuditedGoods(Page<Goods> page);

    /**
     * 获取审核拒绝的商品列表
     * @param page 分页参数
     * @return 审核拒绝的商品列表
     */
    IPage<Goods> getRejectedGoods(Page<Goods> page);

    /**
     * 根据审核状态获取商品列表
     * @param auditStatus 审核状态
     * @param page 分页参数
     * @return 商品列表
     */
    IPage<Goods> getGoodsByAuditStatus(Integer auditStatus, Page<Goods> page);

    // ========== 榜单统计相关方法 ==========

    /**
     * 获取销量排行榜
     * @param limit 限制数量
     * @param categoryId 分类ID（可选）
     * @return 销量排行榜
     */
    List<Goods> getSalesRanking(Integer limit, Integer categoryId);

    /**
     * 获取点赞排行榜
     * @param limit 限制数量
     * @param categoryId 分类ID（可选）
     * @return 点赞排行榜
     */
    List<Goods> getLikesRanking(Integer limit, Integer categoryId);

    /**
     * 获取收藏排行榜
     * @param limit 限制数量
     * @param categoryId 分类ID（可选）
     * @return 收藏排行榜
     */
    List<Goods> getFavoritesRanking(Integer limit, Integer categoryId);

    /**
     * 获取热门商品排行榜
     * @param limit 限制数量
     * @param categoryId 分类ID（可选）
     * @return 热门商品排行榜
     */
    List<Goods> getHotRanking(Integer limit, Integer categoryId);

    /**
     * 获取新品排行榜
     * @param limit 限制数量
     * @param categoryId 分类ID（可选）
     * @return 新品排行榜
     */
    List<Goods> getNewRanking(Integer limit, Integer categoryId);

    /**
     * 获取低价排行榜
     * @param limit 限制数量
     * @param categoryId 分类ID（可选）
     * @return 低价排行榜
     */
    List<Goods> getLowPriceRanking(Integer limit, Integer categoryId);

    /**
     * 获取高价排行榜
     * @param limit 限制数量
     * @param categoryId 分类ID（可选）
     * @return 高价排行榜
     */
    List<Goods> getHighPriceRanking(Integer limit, Integer categoryId);

    /**
     * 获取综合排行榜
     * @param limit 限制数量
     * @param categoryId 分类ID（可选）
     * @return 综合排行榜
     */
    List<Goods> getComprehensiveRanking(Integer limit, Integer categoryId);

    /**
     * 获取分类排行榜
     * @param categoryId 分类ID
     * @param limit 限制数量
     * @param sortBy 排序方式（sales, likes, favorites, price, create_time）
     * @return 分类排行榜
     */
    List<Goods> getCategoryRanking(Integer categoryId, Integer limit, String sortBy);

    /**
     * 直接审核通过商品
     * @param goodsId 商品ID
     * @param auditorId 审核人ID
     * @param auditorName 审核人姓名
     * @param remark 审核备注
     * @return 是否成功
     */
    boolean directApprove(Integer goodsId, Integer auditorId, String auditorName, String remark);

    /**
     * 直接审核拒绝商品
     * @param goodsId 商品ID
     * @param auditorId 审核人ID
     * @param auditorName 审核人姓名
     * @param rejectReason 拒绝原因
     * @return 是否成功
     */
    boolean directReject(Integer goodsId, Integer auditorId, String auditorName, String rejectReason);

    /**
     * 获取榜单统计信息
     * @return 榜单统计信息
     */
    Map<String, Object> getRankingStatistics();

    List<Goods> getBatchByIds(List<Integer> ids);

    Boolean deductStock(Map<Integer, Integer> deductMap);

    Boolean restoreStock(Map<Integer, Integer> restoreMap);

    IPage<Goods> getUserPendingAuditGoods(Page<Goods> page, Integer userId);

    IPage<Goods> getUserAuditedGoods(Page<Goods> page, Integer userId);

    IPage<Goods> getUserRejectedGoods(Page<Goods> page, Integer userId);

    void incrementLikeCount(Integer goodsId);      // 增加点赞数
    void decrementLikeCount(Integer goodsId);     // 减少点赞数
    void incrementFavoriteCount(Integer goodsId); // 增加收藏数
    void decrementFavoriteCount(Integer goodsId); // 减少收藏数
} 